<?xml version="1.0" encoding="UTF-8"?>
<html>
    <head>
        <link type="text/css" rel="stylesheet" href="./css/template.css" />
        <link type="text/css" rel="stylesheet" href="./css/SyntaxHighlighter.css" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>JBoss SEAM</title>
        <script language="javascript" src="./js/shInit.js" />
        <script language="javascript" src="./js/shCore.js" />
        <script language="javascript" src="./js/shBrushCpp.js" />
        <script language="javascript" src="./js/shBrushCSharp.js" />
        <script language="javascript" src="./js/shBrushCss.js" />
        <script language="javascript" src="./js/shBrushDelphi.js" />
        <script language="javascript" src="./js/shBrushJava.js" />
        <script language="javascript" src="./js/shBrushJScript.js" />
        <script language="javascript" src="./js/shBrushPhp.js" />
        <script language="javascript" src="./js/shBrushPython.js" />
        <script language="javascript" src="./js/shBrushRuby.js" />
        <script language="javascript" src="./js/shBrushSql.js" />
        <script language="javascript" src="./js/shBrushVb.js" />
        <script language="javascript" src="./js/shBrushXml.js" />
        <keywords>jboss,seam,eclipse,ide,wtp</keywords>
        <keywords />
        <author>Benjamin HUBY</author>
    </head>
    <body>
        <div class="chapter">
            <h2>Introduction</h2>
            <p>Le framework applicatif JBoss Seam intègre jPDL comme son langage de processus métier, facilitant ainsi l’écriture d’applications
				contenant des workflows complexes, des flux de pages d’applications Web et des interactions utilisateurs.
				Vous trouverez une présentation des capacités de Jboss Seam, ainsi que l’analyse d’une démo d’application.</p>
        </div>
        <div class="chapter">
            <h2>Présentation des outils nécessaires</h2>
            <p>Un ensemble d’outils sont nécessaires afin de faciliter le développement J2EE (ou JAVA EE).
				Même si la nouvelle spécification simplifie énormément les choses.</p>
            <div class="subChapter">
                <h3>Eclipse</h3>
                <p>L’IDE « Eclipse » n’est plus à présenter. C’est l’un des plus utilisé dans le monde Java sans pour autant qu’il soit méconnu des autres (php, C, C++ …).
					La structure / architecture de cet outil a fait toute sa puissance (configuration simple, développement de plugin aisé, installation rapide …).</p>
                <p>
                    <img src="./images/jb-eclipse.jpg" alt="Eclipse" />
                    <br />
                    Vous pouvez télécharger eclipse à l’adresse suivante :
                    <a href="http://www.eclipse.org/downloads" target="_about">Eclipse</a>
                </p>
                <h3>WTP : Webtool Platform</h3>
                <p>WTP est un plugin Open-Source pour Eclipse. Le développement fut lancé par IBM et la communauté depuis 4 ans maintenant.
					Le projet en est à la version 2.0.1 en version stable et est devenu incontournable pour les développeurs Web. Voici un petit récapitulatif de ce que propose ce plugin :</p>
                <ul>
                    <li>Templates de projets (Web / EJB / JSP / Client J2EE)</li>
                    <li>Intégration XDoclet</li>
                    <li>Outils JPA</li>
                    <li>Editeur visuel de JSP</li>
                    <li>Editeur XML</li>
                    <li>Editeur HTML, CSS et Javascript</li>
                    <li>Vue et Perspective spéciales pour J2EE</li>
                </ul>
                La version 3.0 est en cours de préparation et risque d’apporter encore plus de fonctionnalités.
                <p>
                    Vous pouvez soit télécharger le plugin et ses dépendances soit télécharger un bundle incluant l’environnement Eclipse et le plugin déjà installé (conseillé).
                    <a href="http://www.eclipse.org/webtools" target="_about">Eclipse WTP</a>
                </p>
                <h3>JBoss</h3>
                <p>JBoss est un serveur d’application J2EE Open-Source, qui depuis sa version 3, a su s’intégrer dans le monde professionnel.
					Deux versions nous intéressent particulièrement :
					JBoss 4 : version de migration de la spécification J2EE vers JAVA EE. 5
					JBoss 5 : future version implémentant l’ensemble de la spécification JAVA EE 5
					Le point fort de ce serveur est qu’il a proposé très rapidement un serveur d’application incluant les spécifications EJB3 (inclus directement depuis la version 4.0.2).
					Nous utiliserons JBoss 4.2.2 (dernière version stable de jboss).</p>
                <p>
                    JBoss est téléchargeable
                    <a href="http://www.jboss.com" target="_about">ici</a>
                </p>
                <h3>JBoss Seam</h3>
                <p>Téléchargez JBoss Seam et le décompresser dans un répertoire de travail en dehors de l'arborescence du serveur JBoss.
					Editer et configurer le fichier build.properties de votre répertoire Seam en spécifiant le chemin d'installation de JBoss.</p>
            </div>
        </div>
        <div class="chapter">
            <h2>JBoss Seam</h2>
            <div class="subChapter">
                <h3>Présentation</h3>
                <p>JBoss Seam a pour but principal de gérer les problèmes pour les applications web Java qui utilisent JSF et EJB 3.0.
					En effet, il était fastidieux et hasardeux de faire la liaison entre les deux.
					Il permet aussi de réduire les couches de code artificielles liées à la structure de l’application et de rapprocher les EJB de la couche web.
					Il permet d'accéder aux EJB comme à des ‘backing beans’ JSF.</p>
                <p>Ainsi il donne au développeur le choix des couches que son application nécessite, puisqu'il n'existe plus de limites artificielles.
					Enfin il gère automatiquement les composants d'applications : un développeur interagit avec les composants en les récupérant et en les stockant depuis et dans le contexte choisi.</p>
                <h3>Un modèle de programmation contextuel</h3>
                <p>La notion de contexte est utilisée dans de nombreux modèles de programmation Java.
					Par exemple l'utilisateur de l'application en cours de connexion est maintenu dans le contexte Session.
					JBoss Seam ajoute trois contextes aux nombreux déjà existants : Conversation, Process et Application.</p>
                <p>Le premier permet de définir et de gérer simplement les conversations entre différentes requêtes.
					Le second gère les processus afin de définir des tâches et conversations entre eux de manière similaire à JBoss jBPM.
					Le troisième est un contexte disponible durant toute l’application.</p>
                <p>Tous ces contextes sont gérés par JBoss Seam, lequel permet aussi de lié un contexte par défaut à un composant.
					Ainsi un utilisateur connecté peut être représenté par un composant User lié à un contexte session.
					Le développeur doit simplement déclarer les dépendances liées au composant avant de l’exécuter.
					JBoss Seam permet la production d'un code optimisé et réutilisable.</p>
                <h3>Portable et léger</h3>
                <p>JBoss Seam n’utilise que les métadonnées d'annotation JDK 5.0 pour déclarer et associer des composants à un contexte.
					Il n’utilise pas de XML. Il supporte toutes les implémentations JSF. Même si il est recommandé de l’utiliser avec EJB 3.0 et gère aussi les classes persistantes Hibernate et POJO.</p>
            </div>
        </div>
        <div class="chapter">
            <h2>Analyse de la démo</h2>
            <div class="subChapter">
                <h3>Lancer la démo</h3>
                <p>Dans le répertoire jboss-seam/examples/booking directory, tapez ant deploy pour compiler et déployer la démo Hotel Booking.</p>
                <p>Lancer un navigateur et essayer de vous connecter à l'adresse http://localhost:8080/seam-booking/</p>
                <p>
                    La démonstration est également disponible sur
                    <a href="http://seam.demo.jboss.com/home.seam">le site de JBoss</a>
                    .
					Créez un compte en cliquant sur Register pour entrer ensuite sur l'interface principaleEntity bean
                </p>
                <h3>Code de la démo</h3>
                <textarea name="code" class="java">
                    @Stateful
					@Name("hotelBooking")
					@Interceptor(SeamInterceptor.class)
					@Conversational(ifNotBegunOutcome = "main")
					@LoggedIn
					public class HotelBookingAction implements HotelBooking, Serializable {
					private static final Logger log = Logger.getLogger(HotelBooking.class);
					@PersistenceContext(type = EXTENDED)
					private EntityManager em;
					private String searchString;
					@DataModel
					private List
                    <hotel>hotels;
						@DataModelSelectionIndex
						private int hotelIndex;
						@Out(required = false)
						private Hotel hotel;
						@In(required = false)
						@Out(required = false)
						@Valid
						private Booking booking;
						@In
						private User user;
						@In
						private transient FacesContext facesContext;
						// Specify that this method starts a long running conversation
						@Begin
						public String find() {
						hotel = null;
						String searchPattern = searchString == null ? "%" : '%' + searchString.toLowerCase().replace('*', '%') + '%';
						hotels = em.createQuery("from Hotel where lower(name) like :search or lower(city) like :search or lower(zip) like :search or lower(address) like :search")
						.setParameter("search", searchPattern)
						.setMaxResults(50)
						.getResultList();
						log.info(hotels.size() + " hotels found");
						return "main";
						}
						public String getSearchString() {
						return searchString;
						}
						public void setSearchString(String searchString) {
						this.searchString = searchString;
						}
						public String selectHotel() {
						if (hotels == null) return "main";
						setHotel();
						return "selected";
						}
						public String nextHotel() {
						if (hotelIndex
						&lt; hotels.size() - 1) {
						++hotelIndex;
						setHotel();
						}
						return null;
						}
						public String lastHotel() {
						if (hotelIndex &gt; 0) {
						--hotelIndex;
						setHotel();
						}
						return null;
						}
						private void setHotel() {
						hotel = hotels.get(hotelIndex);
						log.info(hotelIndex + "=&gt;" + hotel);
						}
						public String bookHotel() {
						if (hotel == null) return "main";
						booking = new Booking(hotel, user);
						booking.setCheckinDate(new Date());
						booking.setCheckoutDate(new Date());
						return "book";
						}
						@IfInvalid(outcome = REDISPLAY)
						public String setBookingDetails() {
						if (booking == null || hotel == null) return "main";
						if (!booking.getCheckinDate().before(booking.getCheckoutDate())) {
						log.info("invalid booking dates");
						FacesMessage facesMessage = new FacesMessage("Check out date must be later than check in date");
						facesContext.addMessage(null, facesMessage);
						return null;
						} else {
						log.info("valid booking");
						return "success";
						}
						}
						@End
						public String confirm() {
						if (booking == null || hotel == null) return "main";
						em.persist(booking);
						log.info("booking confirmed");
						return "confirmed";
						}
						@Destroy
						@Remove
						public void destroy() {
						log.info("destroyed");
						}
						}</hotel>
                </textarea>
                <h3>Intérêt de Jboss Seam</h3>
                <p>Jboss seam permet de résoudre facilement les problèmes suivant :</p>
                <ul>
                    <li>Le client ne termine pas la transaction</li>
                    <li>Le navigateur du client n'accepte pas les cookies</li>
                    <li>Le client ouvre un autre navigateur et lance un autre achat</li>
                    <li>Le client clique sur le bouton Back de son navigateur</li>
                </ul>
                <p>JBoss Seam en s'attachant à gérer la notion de Conversation va permettre de conduire une transaction et un dialogue avec l'utilisateur très facilement.</p>
                <p>
                    Dans la démo "HotelBookingAction", on retrouve une Session Stateful Bean noté
                    <b>@Stateful</b>
                    (Le tag
                    <b>@Name</b>
                    est un tag Seam donnant un nom à un SSB) qui permettra,
					dans la partie JSF, de déclencher les actions et les assigner à des boutons dans la page Web.
                    <br />
                    <b>@Interceptor</b>
                    est un tag Seam nécessaire pour réaliser la Bijection.
                    <br />
                    <b>@Conversational</b>
                    permet d’assigner un contexte de conversation à unSSB.
                    <br />
                    Enfin
                    <b>@LoggedIn</b>
                    est particulier à l'application HotelBooking, il permet de restreindre l’éxecution de ce Bean à un utilisateur authentifié.
                </p>
                <h3>Le contexte de communication</h3>
                <p>Voici le rôle des différentes annotations rencontrées pour vous présenter un des principes de Seam, le contexte de conversation.</p>
                <p>
                    <textarea name="code" class="java">@Begin
						public String find() {};</textarea>
                    La méthode find est marqué avec l'annotation
                    <b>@Begin</b>
                    et la méthode confirm est marquée avec l'annotation
                    <b>@End</b>
                    .
					Ces 2 marqueurs permettent de commencer et de terminer la transaction.
					La conversation est continue à partir du moment ou l’utilisateur lance l’action find jusqu’au moment ou il confirme son choix.
                </p>
                <p>
                    <textarea name="code" class="java">@End
						public String confirm() {};</textarea>
                    La méthode confirm() est appelé une fois qu'un hôtel a été sélectionné et qu'un objet Booking a été créé.
                </p>
                <p>
                    <textarea name="code" class="java">@IfInvalid(outcome = REDISPLAY)
						public String setBookingDetails(){};</textarea>
                    La méthode setBookingDetails est marquée avec l'annotation @IfInvalid(outcome = REDISPLAY) qui permet en cas d’erreur de réafficher la page courante.
                </p>
                <h3>La bijection</h3>
                <p>Pour comprendre la bijection telle qu'elle est proposée par Seam, il faut connaître un moteur d'IoC (Inversion of Control) comme Spring.
					En quelques mots, l'inversion de contrôle est un pattern qui permet de déclarer des variables dans votre code, d'écrire une méthode setMyObject(Object newObject) mais de déléguer à un moteur l'assignation de cette variable.
					La Bijection c'est à la fois de l'inversion de contrôle mais aussi de la réinjéction de résultat dans le reste de l'application.</p>
                <p>
                    <textarea name="code" class="java">@In(required = false)</textarea>
                    Le marqueur
                    <b>@In</b>
                    de Seam demande au moteur d'injecter la valeur de booking à l'éxecution.
                </p>
                <p>
                    <textarea name="code" class="java">@Out(required = false)</textarea>
                    Le marqueur
                    <b>@Out</b>
                    signifie que l'objet booking sera outjected vers une variable de contexte après que la méthode a été appelée.
                </p>
                <p>
                    <textarea name="code" class="java">@Valid private Booking booking;</textarea>
                    La variable booking qui est dans le contexte de l'utilisateur sera donc automatiquement remplacée par la valeur de cette variable après chaque appel.
                    <br />
                    Le marqueur
                    <b>@Valid</b>
                    vient d'Hibernate. Il permet de valider un objet si les attributs de cet objet sont bien renseignés.
                </p>
            </div>
        </div>
        <div class="chapter">
            <h2>Conclusion</h2>
            <p>JBoss Seam est un moteur basé sur les EJB3 et JSF qui vise à faciliter l'écriture d'une application.
				Réellement novateur, Seam permet d'écrire des applications J2EE de nouvelles générations efficacement, facilement et rapidement.</p>
        </div>
    </body>
</html>

